Delphi code for getting/setting logon information

The code below assumes that a PrintJob is already open.

Calls used
  PEGetNTables
  PEGetNthTableType
  PEGetNthTableLogOnInfo
  PESetNthTableLogOnInfo
  PETestNthTableConnectivity
Code
uses CRDelphi;

{Stringlists to store the LogOn information}
var
  sServerName,
  sUserID,
  sPassword,
  sDatabaseName,
  {These last three are not necessary: they hold Table descriptive 
information}
  sDLLName,
  sDescriptiveName,
  sTableType        : TStringList;

procedure GetLogOnInfo;
var
  LogInfo         : PELogOnInfo;
  TableType       : PETableType;
  nTables, nTable : smallint;
begin
  LogInfo.StructSize := SizeOf(PELogOnInfo);
  TableType.StructSize := SizeOf(PETableType);

  {Loop through the tables}
  nTables := PEGetNTables(PrintJob);
  if nTables = -1 then
    {Do Error Handler};

  {Create storage StringLists}
  sServerName       := TStringList.Create;
  sUserID           := TStringList.Create;
  sPassword         := TStringList.Create;
  sDatabaseName     := TStringList.Create;
  sDLLName          := TStringList.Create;
  sDescriptiveName  := TStringList.Create;
  sTableType        := TStringList.Create;

  {Loop through the tables}
  for nTable := 0 to (nTables - 1) do
  begin
    if not PEGetNthTableType(PrintJob, nTable, TableType) then
      {Do Error Handler};

    {Try to find an SQL table}
    if (TableType.DBType = PE_DT_SQL) or
       (TableType.DBType = PE_DT_SQL_STORED_PROCEDURE) then
    begin
      if not PEGetNthTableLogOnInfo(PrintJob, nTable, LogInfo) then
        {Do Error Handler};

      sServerName.Add(StrPas(@LogInfo.ServerName));
      sUserID.Add(StrPas(@LogInfo.UserID));
      {Password will be blank since it is not stored in the Report}
      sPassword.Add(StrPas(@LogInfo.Password));
      sDatabaseName.Add(StrPas(@LogInfo.DatabaseName));
      sDLLName.Add(StrPas(@TableType.DLLName));
      sDescriptiveName.Add(StrPas(@TableType.DescriptiveName));
      sTableType.Add(IntToStr(TableType.DBType)); 
    end;
  end;
end; 


procedure SetLogOnInfo;
var
  LogInfo          : PELogOnInfo;
  nTable           : smallint;   
  nTables          : smallint;
  nTable           : integer;
  sSN, sUID, sDBN  : string;
  Changed          : boolean;
begin
  LogInfo.StructSize := SizeOf(PELogOnInfo);
  nTable := 0;

  {Get number of tables}
  nTables := PEGetNTables(PrintJob);
  if nTables = -1 then
    {Do Error Handler};

  {Loop through the LogOnInfo items}
  for nTable := 0 to (nTables - 1) do
  begin
    Changed := False;
    {Get the LogOnInfo from the Report}
    if not PEGetNthTableLogOnInfo(PrintJob, nTable, LogInfo) then
      {Do Error Handler};

    {ServerName}
    sSN := StrPas(@LogInfo.ServerName);
    if CompareStr(sSN, sServerName[nTable]) <> 0 then
    begin
      if sServerName[nTable] <> '' then
        StrPCopy(@LogInfo.ServerName, sServerName[nTable]);
      Changed := True;
    end;

    {UserID}
    sUID := StrPas(@LogInfo.UserID);
    if CompareStr(sUID, sUserID[nTable]) <> 0 then
    begin
      if sUserID[nTable] <> '' then
        StrPCopy(@LogInfo.UserID, sUserID[nTable]);
      Changed := True;
    end;

    {Password}
    if sPassword[nTable] <> '' then
    begin
      StrPCopy(@LogInfo.Password, sPassword[nTable]);
      Changed := True;
    end;

    {DatabaseName}
    sDBN := StrPas(@LogInfo.DatabaseName);
    if CompareStr(sDBN, sDatabaseName[nTable]) <> 0 then
    begin
      if sDatabaseName[nTable] <> '' then
        StrPCopy(@LogInfo.DatabaseName, sDatabaseName[nTable]);
      Changed := True;
    end;

    {Send the LogOnInfo to the Report}
    if Changed then
    begin
      if not PESetNthTableLogOnInfo(PrintJob, nTable, LogInfo, False) 
then
        {Do Error Handler};
    end; 
  end; 
  {Free storage StringLists}
  sServerName.Free;
  sUserID.Free;
  sPassword.Free;
  sDatabaseName.Free;
  sDLLName.Free;
  sDescriptiveName.Free;
  sTableType.Free;
end; 


{LogOn Information can be tested before running a Report to confirm that 
a connection can be established with the Server}
function TestLogOnInfo(nTable: smallint) : boolean;
var
  LogInfo : PELogOnInfo;
begin
  Result := False;
  LogInfo.StructSize := SizeOf(PELogOnInfo);

  StrPCopy(@LogInfo.ServerName, sServerName[nTable]);
  StrPCopy(@LogInfo.UserID, sUserID[nTable]);
  StrPCopy(@LogInfo.Password, sPassword[nTable]);
  StrPCopy(@LogInfo.DatabaseName, sDatabaseName[nTable]);

  {Set LogOnInfo}
  if not PESetNthTableLogOnInfo(PrintJob, nTable, LogInfo, False) then
    {Do Error Handler};

  {Test LogOn}
  Result := PETestNthTableConnectivity(PrintJob, nTable);
end;


Seagate Software IMG Holdings, Inc.
http://www.seagatesoftware.com
Support services:
http://support.seagatesoftware.com